﻿Imports System.ComponentModel

Public Class LeveringenForm

#Region "Private declarations"

    Private _mainForm As Form
    Private _detailsForm As LeveringDetailsForm = Nothing

#End Region

#Region "Public property's"

    Private _kanWijzigen As Boolean
    Public Property KanWijzigen() As Boolean
        Get
            Return _kanWijzigen
        End Get
        Set(ByVal value As Boolean)
            _kanWijzigen = value
            tsbWijzigen.Enabled = value
        End Set
    End Property

    Private _kanVerwijderen As Boolean
    Public Property KanVerwijderen() As Boolean
        Get
            Return _kanVerwijderen
        End Get
        Set(ByVal value As Boolean)
            _kanVerwijderen = value
            tsbVerwijderen.Enabled = value
            BindingNavigatorDeleteItem.Enabled = value
        End Set
    End Property

    Private _kanBewaren As Boolean
    Public Property KanBewaren() As Boolean
        Get
            Return _kanBewaren
        End Get
        Set(ByVal value As Boolean)
            _kanBewaren = value
            tsbBewaren.Enabled = value
        End Set
    End Property

#End Region

#Region "Constructor/Initialisatie"

    Public Sub New(ByVal mainForm As Form)
        Me.InitializeComponent()
        _mainForm = mainForm
        Me.BindingNavigatorAddNewItem.Visible = False
        Me.BindingNavigatorSaveItem.Visible = False
        Me.BindingNavigator1.AddNewItem = Nothing
        Me.BindingNavigator1.DeleteItem = Nothing
    End Sub

    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        Try
            Me.LeveranciersBindingSource.DataSource = Utility.Data
            Me.LeveringenBindingSource.DataSource = Utility.Data
            Me.LeveringenBindingSource.Sort = "Id DESC" ' laatste levering bovenaan
            InitGrid()
            KanBewaren = False
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het inladen van de gegevens")
            log.WriteError("LeveringenForm.OnLoad", ex)
        End Try
    End Sub

#End Region

#Region "Event handling"

    Private Sub tsbSluiten_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbAfsluiten.Click
        Me.Close()
    End Sub

    Protected Overrides Sub OnKeyUp(ByVal e As KeyEventArgs)
        MyBase.OnKeyUp(e)
        Select Case e.KeyCode
            Case Keys.F12
                Me.Close()
            Case Keys.F2
                If (Not KanBewaren) Then Return
                BewaarWijzigingen()
            Case Keys.F3
                If (Not KanVerwijderen) Then Return
                Verwijderen()
            Case Keys.F4
                If (Not tsbNieuw.Enabled) Then Return
                NieuweLevering()
            Case Keys.F5
                If (Not KanWijzigen) Then Return
                If (Grid1.SelectedRows.Count > 0) Then
                    BeheerLevering(Grid1.SelectedRows(0).Index)
                End If
        End Select
    End Sub

    Private Sub btnBewaren_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbBewaren.Click
        BewaarWijzigingen()
    End Sub

    Private Sub Grid1_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) Handles Grid1.SelectionChanged
        KanVerwijderen = (Grid1.SelectedRows.Count > 0)
        KanWijzigen = KanVerwijderen
    End Sub

    Protected Overrides Sub OnFormClosing(ByVal e As FormClosingEventArgs)
        MyBase.OnFormClosing(e)
        Me.Validate() ' Valideert en werkt de dataset bij 
        Me.LeveringenBindingSource.EndEdit()
        If (Utility.HasChanges(Utility.Data.Leveringen)) Then
            Dim result As DialogResult = MessageBox.Show("Deze levering bevat wijzigingen. Wil je de wijzigingen bewaren?", "Bewaren", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation)
            Select Case result
                Case DialogResult.Yes
                    BewaarWijzigingen()
                Case DialogResult.Cancel
                    e.Cancel = True
                    Return
                Case DialogResult.No
                    ' annuleer de wijzigingen en laat sluiten
                    Utility.Data.Leveringen.RejectChanges()
            End Select
        End If
        ' We have to dispose of the grid before the form closes to avoid possible DataErrors from the GridViewComboBoxColumn
        Me.Grid1.Dispose()
        _mainForm.BringToFront()
    End Sub

    Private Sub Grid1_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) Handles Grid1.DataError
        MsgBox.ShowError("Ongeldige invoer. Bij een wijziging, druk Esc om de vorige waarde te herstellen")
        log.WriteError("LeveringenForm.Grid1_DataError", e.Exception)
        e.Cancel = True
    End Sub

    Private Sub Grid1_CellDoubleClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles Grid1.CellDoubleClick
        BeheerLevering(e.RowIndex)
    End Sub

    Private Sub btnVerwijderen_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbVerwijderen.Click
        Verwijderen()
    End Sub

    Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BindingNavigatorDeleteItem.Click
        Verwijderen()
    End Sub

    Private Sub btnNieuw_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbNieuw.Click
        NieuweLevering()
    End Sub

    Private Sub LeveringenBindingSource_ListChanged(ByVal sender As Object, ByVal e As ListChangedEventArgs) Handles LeveringenBindingSource.ListChanged
        KanBewaren = Utility.Data.HasChanges()
    End Sub

    Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BindingNavigatorAddNewItem.Click
        If (Not tsbNieuw.Enabled) Then Return
        NieuweLevering()
    End Sub

    Private Sub tsbWijzigen_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbWijzigen.Click
        If (Grid1.SelectedRows.Count > 0) Then
            BeheerLevering(Grid1.SelectedRows(0).Index)
        End If
    End Sub

#End Region

#Region "Helperfuncties"

    Private Sub InitGrid()
        With Grid1
            .ReadOnly = True
            With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Leveringen.IdColumn.ColumnName, Grid1)
                .Visible = False ' Autonumber niet tonen
            End With
            With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Leveringen.DatumColumn.ColumnName, Grid1)
                .Width = 100
            End With
            With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Leveringen.IdLeverancierColumn.ColumnName, Grid1)
                .HeaderText = "Leverancier"
                .Width = 250
                Dim column As DataGridViewComboBoxColumn = DirectCast(DataGridViewHelper.GetGridColumnByDataName _
                    (Utility.Data.Leveringen.IdLeverancierColumn.ColumnName, Grid1), DataGridViewComboBoxColumn)
                column.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing ' verberg de uitklappijl
            End With
            With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Leveringen.FactuurnummerColumn.ColumnName, Grid1)
                .HeaderText = "Leveringsnummer"
                .Width = 150
            End With
        End With
    End Sub

    Private Function BewaarWijzigingen() As Integer
        Try
            Cursor = Cursors.WaitCursor
            If (Not Me.Validate()) Then Return 0
            Me.LeveringenBindingSource.EndEdit()

            Dim aantalToegevoegd As Integer = 0
            Dim aantalVerwijderd As Integer = 0
            Dim aantalGewijzigd As Integer = 0

            For i As Integer = Utility.Data.Leveringen.Count - 1 To 0 Step -1
                ' achterstevoren omdat aantal leveringen kan veranderen tijdens de lus
                Dim row As ArtikelsDataSet.LeveringenRow = Utility.Data.Leveringen(i)
                Select Case row.RowState
                    Case DataRowState.Added
                        aantalToegevoegd += 1
                        Dal.LeveringToevoegen(row)
                    Case DataRowState.Deleted
                        aantalVerwijderd += 1
                        ' TODO: verwijderen samen met details
                    Case DataRowState.Modified
                        aantalGewijzigd += 1
                End Select
            Next
            Dim leveringenTableAdapter As New ArtikelsDataSetTableAdapters.LeveringenTableAdapter
            Dim aantal As Integer = leveringenTableAdapter.Update(Utility.Data.Leveringen)
            'Dim msg As String = String.Format("{0} leveringen(en) werd aangepast.{1}{2} levering(en) werden toegevoegd.{3}{4} levering(en) werden verwijderd.", _
            '    aantalGewijzigd, Environment.NewLine, aantalToegevoegd, Environment.NewLine, aantalVerwijderd)
            'MessageBox.Show(msg, "Bewaren", MessageBoxButtons.OK, MessageBoxIcon.Information)
            KanBewaren = False
            Return aantal
        Catch ex As Exception
            log.WriteError("LeveringenForm.BewaarWijzigingen", ex)
            If (ex.Message.Contains("related records")) Then ' TODO: ook Nederlandse foutboodschap onderscheppen
                MsgBox.ShowError("Sommige leveringen konden niet verwijderd worden omdat ze nog details bevatten. Verwijder eerst de details via de knop ""Wijzigen (F5)"".")
            Else
                MsgBox.ShowError("Fout tijdens het bewaren")
            End If
            ' haal de data opnieuw op zodat we weer de werkelijke toestand zien en 
            ' niet de gewijzigde toestand waarvan het bewaren mislukt is
            RefreshGrid()
        Finally
            Cursor = Cursors.Default
        End Try
        Return 0
    End Function

    Private Sub Verwijderen()
        Try
            Cursor = Cursors.WaitCursor
            'If (Me.ArtikelsDataSetBindingSource.Current IsNot Nothing) Then
            'Me.ArtikelsDataSetBindingSource.RemoveCurrent()
            'End If
            If Me.Grid1.SelectedRows.Count > 0 Then
                Dim selectedRow As DataGridViewRow = Grid1.SelectedRows(0)
                Dim leveringId As Integer = DataGridViewHelper.GetValueFromDataGridRow(Of Integer)(Utility.Data.Leveringen.IdColumn.ColumnName, selectedRow)
                Dim dataRow As ArtikelsDataSet.LeveringenRow = Utility.Data.Leveringen.FindById(leveringId)
                If (dataRow.GetLeveringDetailsRows.Count > 0) Then
                    MsgBox.ShowError("Deze levering kan niet verwijderd worden omdat er nog leveringsdetails aan verbonden zijn. Verwijder eerst de details.")
                    Return
                End If
                'Dim originalState As DataRowState = dataRow.RowState
                Grid1.Rows.Remove(selectedRow)
                'If (Not originalState = DataRowState.Added) Then
                '    ' Deze levering bestond al. Verwijder de rij in de grid, maar
                '    ' ook in de dataset (in plaats van een rij met RowState=Deleted te laten), 
                '    ' zodat er niets in de databank gewijzigd wordt
                '    Me.ArtikelsDataSet1.Leveringen.RemoveLeveringenRow(dataRow)
                'End If
                KanBewaren = True
            End If
        Catch ex As Exception
            log.WriteError("LeveringenForm.Verwijderen", ex)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Sub BeheerLevering(ByVal rowIndex As Integer)
        Try
            Cursor = Cursors.WaitCursor

            Dim leveringenRow As ArtikelsDataSet.LeveringenRow = Utility.GetGridDataRow(Of ArtikelsDataSet.LeveringenRow)(Grid1, rowIndex)
            If (leveringenRow Is Nothing) Then Return ' bijvoorbeeld bij dubbelklikken op lege rij onderaan

            _detailsForm = New LeveringDetailsForm(leveringenRow.Id)
            _detailsForm.ShowInTaskbar = True
            AddHandler _detailsForm.FormClosed, AddressOf Me.OnDetailsFormClosed
            Me.Enabled = False
            _detailsForm.Show() ' geen ShowDialog, zodat het naast kasblad kan draaien
        Catch ex As Exception
            log.WriteError("LeveringenForm.BeheerLevering", ex)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Sub NieuweLevering()
        Try
            Cursor = Cursors.WaitCursor
            _detailsForm = New LeveringDetailsForm()
            _detailsForm.ShowInTaskbar = True
            AddHandler _detailsForm.FormClosed, AddressOf Me.OnDetailsFormClosed
            Me.Enabled = False
            _detailsForm.Show() ' geen ShowDialog, zodat het naast kasblad kan draaien
        Catch ex As Exception
            log.WriteError("LeveringenForm.NieuweLevering", ex)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Sub RefreshGrid()
        ' haal de data opnieuw op zodat we weer de werkelijke toestand zien  
        Utility.Data.Leveringen.RejectChanges()
    End Sub

    Private Sub OnDetailsFormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs)
        ' update grid gaat vanzelf
        Me.Enabled = True
        KanBewaren = Utility.Data.HasChanges()
        LeveringenBindingSource.Position = LeveringenBindingSource.Find("ID", _detailsForm.IdLevering)
        _detailsForm = Nothing
    End Sub

#End Region

End Class